#ifndef PHYSICS2D_H
#define PHYSICS2D_H

#include "CVect2d.h"
#include "math.h"
#include "CVect3d.h"

struct TBall {  // apskiritimas
    CVect2d pos, speed;
    double radius;
    float r, g, b;  // spalva
    bool inHole;    // ar įmušytas?
    int number;     // kamuoliuko numeris
    int status;     // statusas  -1 ridinejasi, 0-5 - krenta į skylę, 6 - rieda takeliu, 7 - stovi takelyje
    CVect3d p, p2;  // ta6kai kamuoliuko išorėje, ridenimuisi
};

struct TBox {   // AABB stačiakampis
    CVect2d pos, hsize; // pusė pločio ir auščio
    float r, g, b;  // spalva
};

struct TArrow {     // rodiklytė vėktoriams piešti
    CVect2d pos, dir;
    float r, g, b;
};

struct TTriangle {  // trikampis
    CVect2d p[3];    // viršūnės
    float r, g, b;  // spalva
};

struct TSpline {    // siena
    CVect2d p1, p2; // sineos taškai
};

// tikrina ar du kamuoliai susiduria
bool elasticCollision( TBall &a, TBall &b );
// tikrina ar susiduria apskritimas su AABB statčiakampiu
bool collide( const TBall &a, const TBox &b );
// tikrina ar susiduria apskritimas su kitu apskritimu
bool collide( const CVect2d &aPos, const CVect2d &bPos, const double &aRad, const double &bRad );
// tikrina ar susiduria apskritimas su trikampiu
bool collide( TBall &a, const TTriangle &b );
// tikrina ar apskritimo centras yra kitame apskritime
bool inHole( const TBall &a, const TBall &b );

double pointDisToLine( const CVect2d &p, const CVect2d &lp1, const CVect2d &lp2 );


// susidurimo metodai
bool pushOut( TBall &a, const TBall &b );
bool pushOut( TBall &a, const TBox &b );

double circleDisToSpline( CVect2d cPos, double cRad, CVect2d cDir, CVect2d p1, CVect2d p2 );
CVect2d circleCPOnSpline( CVect2d cPos, double cRad, CVect2d cDir, CVect2d p1, CVect2d p2 );
double circleToMovingCircle( CVect2d aPos, CVect2d bPos, CVect2d aSpeed, CVect2d bSpeed, double aRad, double bRad );



#endif // PHYSICS2D_H
